package com.bestcem.xm.user.service;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.user.grpc.client.dto.IndustryDTO;
import com.bestcem.xm.user.service.dto.user.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 登录注册服务
 *
 * @author wangyunyun <yunyun.wang@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/1 14:30
 */
public interface UserAuthService {

    /**
     * 注册账号-完善信息并注册
     *
     * @param orgRegisterDTO 公司注册dto
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/1 14:30
     */
    ServiceResult<UserLoginDTO> orgRegister(OrgRegisterDTO orgRegisterDTO);

    /**
     * 通过行业id和ip获取行业信息和行业对应的地区的销售电话
     *
     * @param ipAddress  ip地址
     * @param industryId 行业id
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/7 17:50
     */
    IndustryDTO getIndustryAndContacts(String ipAddress, String industryId);

    /**
     * 用户使用账号名、密码、org_code登录获取token信息
     *
     * @param userName 账户名
     * @param password 密码
     * @param encrypt  密码是否加密
     * @param orgCode  公司code
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.RefreshTokenDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/29 11:24
     */
    ServiceResult<RefreshTokenDTO> getToken(String userName, String password, boolean encrypt, String orgCode);

    /**
     * 刷新token
     *
     * @param userId  用户id
     * @param orgCode 租户编码
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.RefreshTokenDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/29 11:03
     */
    ServiceResult<RefreshTokenDTO> refreshToken(String userId, String orgCode);

    /**
     * 校验用户密码是否正确
     *
     * @param userId   用户id
     * @param password 用户输入的密码【明文】
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/04 09:35
     */
    ServiceResult<Boolean> checkPassword(String userId, String password);

    /**
     * 用户修改密码
     *
     * @param userId      用户id
     * @param oldPassword 原密码【明文】
     * @param newPassword 新密码【明文】
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/04 10:08
     */
    ServiceResult<Boolean> updatePassword(String userId, String oldPassword, String newPassword);

    /**
     * 重置用户密码
     *
     * @param userId 用户id
     * @return com.bestcem.xm.util.ServiceResult
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/04 16:05
     */
    ServiceResult<Boolean> resetPassword(String userId, String password);

    /**
     * 用户注册验证手机号唯一
     *
     * @param phone 手机号
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/4 14:30
     */
    ServiceResult<String> validatePhone(String phone);

    /**
     * 注册账号-验证手机号和验证码
     *
     * @param phone 手机号
     * @param vcode 验证码
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/4 14:30
     */
    ServiceResult<String> validatePhoneAndCode(String phone, String vcode);

    /**
     * 手机号码快速登录
     *
     * @param phone     手机号
     * @param vcode     验证码
     * @param ipAddress ip地址
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/4 14:30
     */
    ServiceResult<UserLoginDTO> fastLogin(String phone, String vcode, String ipAddress);

    /**
     * 问卷登录
     *
     * @param code     公司编码
     * @param host     host
     * @param protocol protocol
     * @return com.bestcem.xm.util.ServiceResult
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/04 17:39
     */
    ServiceResult<WenJuanLoginResultDTO> wenJuanLogin(String code, String host, String protocol);

    /**
     * 根据orgUUid获取缓存信息
     *
     * @param orgUuid orgUuid
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.WjwOrganizationInfoDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/05/29 12:56
     */
    ServiceResult<List<WjwOrganizationInfoDTO>> getWjwCacheOrgInfos(String orgUuid);

    /**
     * 一个手机号码对应多个用户时快速登录 选择企业快速登录
     *
     * @param orgCode
     * @param sessionId
     * @param ipAddress
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/6 11:30
     */
    ServiceResult<UserLoginDTO> fastLoginByOrg(String orgCode, String sessionId, String ipAddress);

    /**
     * 手机号码和邮箱登录
     *
     * @param username
     * @param password
     * @param sessionId
     * @param ipAddress
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/6 14:30
     */
    ServiceResult<UserLoginDTO> phoneOrEmailFastLogin(HttpServletResponse response, String username, String password, String sessionId, String ipAddress);

    /**
     * 公司代号登录
     *
     * @param response
     * @param orgLoginDTO
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/6 18:30
     */
    ServiceResult<UserLoginDTO> orgAndUsernameLogin(HttpServletResponse response, OrgLoginDTO orgLoginDTO);

    /**
     * 快速登录注册
     *
     * @param orgRegisterDTO
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/6 17:00
     */
    ServiceResult<UserLoginDTO> fastRegister(OrgRegisterDTO orgRegisterDTO);

    /**
     * Bi-分享密码获取token接口
     *
     * @param shareId  bi分享的id
     * @param password 密码
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/29 14:27
     */
    ServiceResult<String> bishareToken(String shareId, String password);

    /**
     * 校验注册手机号是否已经存在
     *
     * @param phone   手机号
     * @param edition 版本
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/2 14:30
     */
    ServiceResult<String> checkRegisterPhone(String phone, Integer edition);

    /**
     * 通过行业编码和ip获取行业信息和行业对应的地区的销售邮箱
     *
     * @param ipAddress    IP
     * @param industryCode 行业编码
     * @return com.bestcem.xm.user.grpc.client.dto.IndustryDTO
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/30 15:00
     */
    IndustryDTO getIndustryAndSalesEmails(String ipAddress, String industryCode);

    /**
     * 根据user获取token信息
     *
     * @param userDTO
     * @return token信息
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/3/30 16:30
     */
    ServiceResult<WxLoginDTO> getTokenByUser(UserDTO userDTO);

    /**
     * 登录成功完善公司信息
     *
     * @param completeOrgInfoDTO 参数信息
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/03/02 16:30
     */
    ServiceResult<Void> completeOrgInfo(CompleteOrgInfoDTO completeOrgInfoDTO);

    /**
     * 跳过完善公司信息
     *
     * @param orgId
     * @param userId
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * qiongyu.cui <qiongyu.cui@idiaoyan.com>
     * @date 2022/03/02 16:30
     */
    ServiceResult<Void> jumpCompleteOrgInfo(String orgId, String userId);

    /**
     * homePage重置密码
     *
     * @param param 重置密码参数
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.ResetPasswordResultDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/05/28 20:38
     */
    ServiceResult<ResetPasswordResultDTO> resetPasswordByToken(ResetPasswordParamDTO param);

    /**
     * 根据orgCode重置密码
     *
     * @param param 重置密码参数
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.ResetPasswordResultDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/05/28 20:39
     */
    ServiceResult<ResetPasswordResultDTO> resetPasswordByOrgCode(ResetPasswordParamDTO param);

    /**
     * 根据userId、token、password重置密码
     *
     * @param userId   用户id
     * @param token    token信息
     * @param password 密码【明文】
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/08 11:13
     */
    ServiceResult<String> resetPassword(String userId, String token, String password);

    /**
     * 更新用户的最后登录时间
     *
     * @param userId 用户id
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/29 12:40
     */
    void updateUserLastLoginTime(String userId);

    /**
     * 删除用户锁定状态
     *
     * @param userName 用户名称
     * @param orgCode  组织编码
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/07 19:54
     */
    ServiceResult<Void> delUserLock(String userName, String orgCode);

    /**
     * 发送重置密码邮件
     *
     * @param captchaKey  图形验证码key
     * @param email       邮箱
     * @param captchaCode 图形验证码
     * @param orgCode     租户code
     * @param uri         uri地址
     * @param serverName  请求的服务名
     * @param protocol    请求的协议
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/08 13:53
     */
    ServiceResult<Void> sendResetPwdEmail(String captchaKey, String email, String captchaCode, String orgCode, String uri,
                                          String serverName, String protocol);


    /**
     * 飞书对接获取token
     *
     * @param userId 用户id
     * @return user login info
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/6/24 13:51
     */
    ServiceResult<UserLoginDTO> feishuGetToken(String userId);

    /**
     * 通过用户名和密码查找用户
     * 传入org_code为查询单个用户，否则可能存在多个
     * XM.apps_mysql.user.util.utils.find_user_by_auth
     *
     * @param userName 登录用户名
     * @param password 登录密码
     * @param orgCode  公司编码
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.UserDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/5 15:09
     */
    ServiceResult<List<UserDTO>> findUserByAuth(String userName, String password, String orgCode);
}
